/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.beautycenter.ModelosTabela;

import br.com.beautycenter.DAO.PersisteFuncionario;
import br.com.beautycenter.Funcionalidades.Data;
import br.com.beautycenter.DAO.PersisteSessao;
import br.com.beautycenter.DAO.PersisteTratamento;
import br.com.beautycenter.bean.Funcionario;
import br.com.beautycenter.bean.Sessao;
import br.com.beautycenter.bean.Tratamento;
import br.com.beautycenter.view.DadosCliente;
import java.text.ParseException;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author magelinha
 */
public class TableModelSessoesDia extends AbstractTableModel {
    
    private List<Sessao> listaSessoes;
    PersisteSessao persisteSessao = new PersisteSessao();
    PersisteTratamento persisteTratamento = new PersisteTratamento();
    PersisteFuncionario persisteFuncionario = new PersisteFuncionario();
    
    DadosCliente parent;
    private String[] colunas = new String[]{"Nº da Sessão","Tratamento", "Horário", "Funcionário"};
    
    private static final int NUMERO_SESSAO = 0;
    private static final int TRATAMENTO = 1;
    private static final int HORARIO = 2;
    private static final int FUNCIONARIO = 3;

    public TableModelSessoesDia(JDialog parent, List<Sessao> listaSessoes) {
        this.listaSessoes = listaSessoes;
        this.parent = (DadosCliente)parent;
    }

    @Override
    public int getRowCount() {
        return listaSessoes.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(final int rowIndex, int columnIndex) {
        switch(columnIndex){
            case NUMERO_SESSAO:
                return listaSessoes.get(rowIndex).getNumeroSessao();
                
            case TRATAMENTO:
                return listaSessoes.get(rowIndex).getTratamento().getNomeTratamento();
                
            case HORARIO:
                return Data.horaSimpels.format(listaSessoes.get(rowIndex).getHorario());
                
            case FUNCIONARIO:
                return listaSessoes.get(rowIndex).getFuncionario().getNome();
                
            default:
                throw new IndexOutOfBoundsException("Não é possivel pegar o valor da coluna desejada");
        }
    }
    
    @Override
    public String getColumnName(int columnIndex){
        return colunas[columnIndex];
    }
    
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        Sessao sessao = listaSessoes.get(rowIndex);
        switch(columnIndex){
            case NUMERO_SESSAO:
                sessao.setNumeroSessao((Integer)aValue);
                break;
                
            case TRATAMENTO:
                Tratamento tratamento = new Tratamento();
                tratamento.setNomeTratamento(aValue.toString());
                sessao.setTratamento(persisteTratamento.retornarTratamentoPeloNome(tratamento).get(0));
                break;
                
                
            case HORARIO:
                try{
                    sessao.setHorario(Data.horaSimpels.parse(aValue.toString()));
                }catch (ParseException ex) {
                    sessao.setHorario(null);
                }
                
                break;
                
            case FUNCIONARIO:
                Funcionario funcionario = new Funcionario();
                funcionario.setNome(aValue.toString());
                sessao.setFuncionario(persisteFuncionario.retornarFuncionarioPeloNome(funcionario).get(0));
                break;
                
            default:
                throw new IndexOutOfBoundsException("Não é possivel pegar o valor da coluna desejada");
        }
        
        fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula
    }
    
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        return false; //nenhuma célula é editável
    }
    
    @Override
    public Class<?> getColumnClass(int columnIndex){
        switch(columnIndex){
            case NUMERO_SESSAO:
                return Integer.class;
                
            case TRATAMENTO:
                return String.class;
                
            case HORARIO:
                return String.class;
                
            case FUNCIONARIO:
                return String.class;
                
            default:
                throw new IndexOutOfBoundsException("Coluna não existe na tabela " + columnIndex);
        }
    }
    
    /*
     * Metodos para manipulação de dados
     */
    
    /**
     * Pega a sessão selecionada na tabela
     * @param linha 
     */
    public Sessao getSessao(int linha){
        return listaSessoes.get(linha);
    }
    
    public void addSessao(Sessao sessao){
        listaSessoes.add(sessao);
        
        int ultimo = getRowCount()-1;
        
        fireTableRowsInserted(ultimo, ultimo);
    }
    
    /**
     * Remove uma determinada linha da tabela
     */
    public void removeSessao(int linha){
        listaSessoes.remove(linha);
        
        fireTableRowsDeleted(linha, linha);
    }
    
    public void addListaSessoes(List<Sessao> lista){
        int indice = getRowCount();
        listaSessoes.addAll(lista);
        
        fireTableRowsInserted(indice, indice + lista.size());
    }
    
    public void clear(){
        listaSessoes.clear();
        fireTableDataChanged();
    }
    
}
